"""
题目：实现二叉树的自底向上层序遍历（从叶子节点所在层到根节点所在层，同一层从左到右）。
"""


class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


def level_order_bottom(root):
    """自底向上的层序遍历（从叶子到根，每一层从左往右）"""
    if not root:  # 空树返回空列表
        return []
    result = []
    queue = [root]  # 队列存储下一层所有节点
    while queue:
        level_size = len(queue)
        current_level = []
        # 遍历当前层节点,体现了：level_size有几个节点，就循环几次(每次循环都要把节点的左右子节点处理好)
        for _ in range(level_size):
            node = queue.pop(0)
            current_level.append(node.val)
            # 添加子节点到队列
            if node.left:
                #注意，这里是queue对象添加了当前处理节点的左右子节点，不是其他对象 别看错了;这里queue对象搜集好了，供while循环继续判断使用
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        # 将当前层结果插入到列表头部（实现倒序）
        result.insert(0, current_level)
    return result

# 辅助函数：创建二叉树（复用）
def create_binary_tree(arr):
    if not arr:
        return None
    root = TreeNode(arr[0])
    queue = [root]
    index = 1
    while queue and index < len(arr):
        current = queue.pop(0)
        if arr[index] is not None:
            current.left = TreeNode(arr[index])
            queue.append(current.left)
        index += 1
        if index < len(arr) and arr[index] is not None:
            current.right = TreeNode(arr[index])
            queue.append(current.right)
        index += 1
    return root


# 测试
root = create_binary_tree([3, 9, 20, None, None, 15, 7])
# 树结构：
#       3
#      / \
#     9  20
#       /  \
#      15   7
# 正常层序：[[3], [9,20], [15,7]]
# 自底向上：[[15,7], [9,20], [3]]
print(level_order_bottom(root))  # 输出: [[15, 7], [9, 20], [3]]
